[Bitbucket] SSHキーを使用してコミットに署名する

 

Bitbucket Cloud で SSH キーを使用してコミットに署名できるようになりました。

SSH キーを使用してコミットに署名できるようになりました。- アトラシアンのワークライフ

署名付きコミットは、開発者がSSH キーを使用してコントリビューションの信頼性を確認できるようにする、重要な保護レイヤーを提供します。

本ページでは SSH キーを使用した署名付きコミットの設定手順、実際に使用してみた画面などを紹介します。

 

 

 

 

1. 概要

各人の SSH キーを使用してコミットに署名することができます。下図のように Bitbucket Cloud の Commits 画面で検証結果を確認することが可能です。

 

画面例

 

SSH キーを使用してコミットに署名する主な理由は、コードの信頼性とセキュリティを向上させるためです。この手法を利用することには、次のような利点があります。

  1. 改ざん防止: 署名付きコミットを使用することで、コミットが正規の開発者によって作成されたことを証明できます。これにより、第三者がコードを不正に変更するリスクを軽減します。
  2. 信頼性の向上: SSH キーを使ってコミットに署名すると、受信者がそのコミットの発信者を検証できるようになります。特に、チームでの開発やオープンソースプロジェクトでは、このプロセスは重要です。
  3. セキュリティの強化: SSH キーによる署名付きコミットは、パスワードやトークンよりも安全性が高く、特に機密性の高いプロジェクトに適しています。

 

注意

v2.34 以降の git で本機能を使用することができるようです。

古い git を使用している場合は新しい git へ更新してお試しください。

 

 

 

2. 既存の SSH キーを確認する

SSH キーがまだあるかどうかわからない場合は、ローカルで既存の SSH キーを確認できます。

既存のSSHキーがあるかどうかを確認するには:

  1. ターミナルで、次のコマンドを使用して、アクセスできるSSHキーを一覧表示します。
    ls -al ~/.ssh
    もしくは .ssh フォルダ中に bitbucket フォルダなどを作成して分けて扱っている場合は次のコマンドを使用します。
    ls -al ~/.ssh/bitbucket
  2. 出力をチェックして、SSH キー ペアがあるかどうかを確認します。

 

 

3. 新しい SSH キーを生成して追加する

既に登録済みの SSH キーを使用してコミットに署名する場合、次章へ進んでください。

コミットに署名するための新しい SSH キーを生成して追加するには、使用するオペレーティング システムに応じた手順に従います。

または私が作成した記事(How to use SSH key.html)を参照して SSH キーを作成および登録を行います。

NOTE

Bitbucket は認証キー(Authentication key)と署名キー(Signing key)の違いありません。

Github はホームページ上で登録時に 'Key type' として選択します。初期状態は認証キー(Authentication key)になっているので、署名キーを登録する場合は変更する必要があります。

 

 

4. SSH キーでコミットに署名する

SSH キーを使用してコミットに署名するには、ターミナル (CLI) を使用して次の手順に従います。

下記では "--global" を付与して全ての git を対象とする設定を例に記載しています。リポジトリ毎に設定する場合は "--global" を削除して実施します。

  1. キーの形式についてGitに伝えます。
    git config --global gpg.format ssh
  2. コミットの署名に使用するキーを Git に指示します。

    私の場合は ~/.ssh/bitbucket/id_ed25519.pub を公開鍵として使用しているので下記コマンドを使用します。

    git config --global user.signingkey ~/.ssh/bitbucket/id_ed25519.pub
  3. ローカルブランチに変更をコミットする場合は、コマンドのフラグ(-S)を使用します。
    git commit -S -m "your commit message"

    -S を毎回つけるのが面倒な場合は、後述の "5. git commit で常に署名するように設定する" を確認してください。

  4. SSH キーのパスフレーズを入力します。(パスフレーズを登録している場合のみ)
  5. コミットが署名されたことを確認します。(必要に応じて)
    "-1" は最新コミットから1つを表示することを意味します。 "-3" は最新コミットから3つを表示します。
    git log --show-signature -1
    表示例です。
    実行結果例

    NOTE:
    ディレクトリにファイルをセットアップする必要があります。詳細については、 Git ドキュメントを参照してください。
    bitbucket@example.com の部分は Bitbucket アカウントに関連付けられているあなたのメール アドレスへ置き換えて使用してください。
    (私はこれの必要性をまだ理解できていません。この手続きなしでコミット署名できているように見えます。)
    echo "bitbucket@example.com $(cat ~/.ssh/id_ed25519.pub)" > ~/.ssh/allowed_signers
    git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
  6. 必要に応じて、ssh-agent を再実行することを検討してください。
    ssh-add ~/.ssh/id_ed25519.pub
    eval $(ssh-agent)
  7. 以上を設定後の私の .gitconfig ファイルを紹介します。
    [".gitconfig"]
    kinoshita@PC-FooBoo:~$ cat .gitconfig
    [user]
            name = kinoshita hidetoshi
            email = ********@********.com
            signingkey = /home/kinoshita/.ssh/bitbucket/id_ed25519.pub
    [gpg "ssh"]
            allowedSignersFile = /home/kinoshita/.ssh/allowed_signers
    [gpg]
            format = ssh
    "--global" を付けずに各リポジトリで設定した場合はリポジトリ内の ".git/config" ファイルに同様の情報が記載されます。
    [".git/config"]
    [core]
            省略
    [remote "origin"]
            省略
    [branch "main"]
            省略
    [commit]
            gpgsign = true
    [gpg]
            format = ssh
    [user]
            signingkey = /home/kinoshita/.ssh/bitbucket/id_ed25519.pub

 

 

5. git commit で常に署名するように設定する

git commit 時に “-S“ を付けて実施することは面倒です。一部のツールではこれを補助する仕組みがある様子ですが、常に署名してくれる方が良い場合もありそうです。

署名対象のディレクトリへ移動後、下記コマンドを実行します。

git config commit.gpgsign true

 

もしくは全てを対象に有効化する場合は ‘--global’ を付けて下記コマンドを実行します。

git config --global commit.gpgsign true

 

後者のコマンドを実行後の私の .gitconfig ファイル例です。(メールアドレスは **** で変更表記しています)

kinoshita@PC-FooBoo:~$ cat .gitconfig
[user]
        name = kinoshita hidetoshi
        email = ********@********.com
        signingkey = /home/kinoshita/.ssh/bitbucket/id_ed25519.pub
[gpg "ssh"]
        allowedSignersFile = /home/kinoshita/.ssh/allowed_signers
[gpg]
        format = ssh
[commit]
        gpgsign = true

 

以上の設定により git commit に “-S” を付けることなくコミットに対して常に署名するようになります。

 

 

6. 署名検証のステータス

以上の設定と署名付きコミットを行ったのち、Bitbucket Cloud へプッシュした Commits 画面を紹介します。「✔」 の表示が追加されました。

画面例

 

「✔」 部分をクリックすると以下の表示を確認できました。

画面例

 

表 : ステータスと結果
ステータス 結果
Verified
  • 信頼された作成者がコミットに署名し、署名が検証されました
Unverified
  • コミットには SSH 署名がありますが、メールの不一致により検証が失敗します
  •  コミットの署名に使用されたキーが Bitbucket ユーザー アカウントにアップロードされていません
  •  コミットに署名するためのキーがサポートされていないか、無効です (削除または取り消されています)
No Signature
  • コミットは、署名付きコミットの実装前に作成されました
  •  コミットが署名されていません
  •  コミットは Bitbucket Web インターフェイスを通じて行われています
  •  コミットは merge strategy で行われました。

 

 

7. つまり、設定手順を簡単に説明すると...

いろいろ記載しましたが、Bitbucket でコミット署名の設定手順を要約すると以下のような感じになります。

個別の内容は適宜変更してください。

  1. SSH 認証鍵を作成
  2. SSH 認証鍵を Bitbucket へ登録
  3. キーの形式を指定
    $ git config gpg.format ssh
  4. コミット署名に使用する SSH 認証鍵を指定(以下は例です)
    $ git config user.signingkey ~/.ssh/bitbucket/id_ed25519.pub
  5. git commit で常に署名するように設定
    $ git config commit.gpgsign true

1-2 は、既に作成および登録済みの認証鍵を使用する場合は実施不要。

3-5 は、設定を行うリポジトリ内で行います。リポジトリ毎に異なる設定を行えますので、例えば Bitbucket と GitHub 両方を使用している、という人でも安心です。

全部共通で良い、という場合は 3-5 のコマンド実行時に --global オプションを追加します。

逆に --global オプションで設定を行ったうえで、動作条件が異なるリポジトリのみ個別変更という方法もできそうです。

 

注意

下記2つのメールアドレスが一致している必要があります。

  • リポジトリで設定のメールアドレス
    git config --global/--local user.email "username@gmail.com"
  • SSH 認証鍵に記載のメールアドレス

 

 

 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

  Copyright 2025 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

参考

 


 

変更履歴

2025-05-30 - 7._つまり、設定手順を簡単に説明すると...」を追加
2025-03-19 - 新規作成

 

Programming Items トップページ

プライバシーポリシー